﻿using DelegetAndEventTest.PbulishAndSubscribe;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegetAndEventTest
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 测试委托与事件
            {

                /*
                 *委托的本质是类，事件就是委托的一个实例，自我认为绑定事件的过程就在对应的数据方法数组中添加方法引用的过程，
                 * 事件调用的过程就是批量执行的过程。
                 **/
                //1.测试委托与事件
                //A a = new A(); //A发布事件
                //{
                //    B b = new B();//B订阅事件
                //    a.FallEvent += new FallHandler(b.a_FallEent);// 实例化委托
                //    a.RaiseEvent += b.a_RaiseEvent;
                //    a.ZaEvent += b.a_ZaEvent;
                //}
                //{ 
                //    C c = new C();//C订阅事件
                //    a.FallEvent += c.a_FallEvent;
                //    a.RaiseEvent += c.a_RaiseEvent;
                //    a.action += c.Attack;
                //    a.raise = c.a_RaiseEvent;
                //    a.ZaEvent += c.a_ZaEvent;
                //}
                //a.Raise("右手");
                //a.Raise("左手");
                //a.Fall();
                //a.action();
                
                ////委托可以直接调用
                //a.raise = c.a_RaiseEvent;
                //a.raise("右手");
                //测试有返回值的事件如果都订阅了返回什么值？答案：返回最后一个事件返回的结果。
                //string str = a.Za(9);
                //Console.WriteLine(str);
            }
            {
                //2.委托测试（通过委托实现的冒泡排序）
                //DelegateSample.Show();
            }
            #endregion

            #region 测试Lambda表达式
            {
                //LambdaTest ld = new LambdaTest();
                //Console.WriteLine(ld.square(3));
                //int sq = ld.GetSquare(5);
                //Console.WriteLine(sq);
                //传入lambda表达式,打印乘法口诀
                //ld.ShowValue((x,y) => { return x * y; });

                //异步调用，此步采用异步操作不会等待
                //Task<int> result = ld.ShowValueAsync(3);
                //Console.WriteLine("看看是否等待1。。。");
                ////这个步骤才是真正的等待结果
                //Console.WriteLine(result.Result);
                //Console.WriteLine("看看是否等待2。。。");
            }
            #endregion

            #region 测试枚举泛型
            {
                //3.测试枚举泛型
                //Dictionary<int, string> dic = EnumHelper<Rainbow>.EnumNamedValues();
                //foreach (var item in dic)
                //{
                //    Console.WriteLine($@"{item.Key}:{item.Value}");
                //}
                //Console.WriteLine("\"Hi\"");
            }
            #endregion

            #region 测试发布订阅模式
            PublishAndSubscribeTest.Show();
            #endregion


            Console.ReadKey();
        }
    }
}
